package logika;

import grafika.Predplatitel;
import grafika.Vydavatel;
import java.util.ArrayList;
import java.util.List;

/**
 *  Class HerniPlan - třída představující mapu adventury.
 * 
 *  Tato třída inicializuje prvky ze kterých se hra skládá:
 *  vytváří všechny prostory,
 *  propojuje je vzájemně pomocí východů 
 *  a pamatuje si aktuální prostor, ve kterém se hráč právě nachází.
 *
 *@author     Michael Kolling, Lubos Pavlicek, Jarmila Pavlickova
 *@version    pro školní rok 2010/2011
 */
public class HerniPlan implements Vydavatel {

    private Prostor aktualniProstor;
    private Batoh batoh;

    /**
     *  Konstruktor který vytváří jednotlivé prostory a propojuje je pomocí východů.
     *  Jako výchozí aktuální prostor nastaví halu.
     */
    public HerniPlan() {
        zalozProstoryHry();
        batoh = new Batoh();
    }

    /**
     *  Vytváří jednotlivé prostory a propojuje je pomocí východů.
     *  Jako výchozí aktuální prostor nastaví halu.
     */
    private void zalozProstoryHry() {
        Prostor megaton;
        Prostor wasteland;
        Prostor station;
        Prostor ammo;
        Prostor tenpennyTower;
        Prostor supermarket;

        // vytvářejí se jednotlivé prostory
        megaton = new Prostor("Megaton", ", slum postavený okolo obrovské nevybuchlé atomové bomby");
        wasteland = new Prostor("Wasteland", " , pozůstatky velkého města po atomové válce");
        station = new Prostor("stanice", " , stará zchátralá policejní stanice,\n"
                + "ve které po vybití Supermutantů opět žijí lovci lidí");
        ammo = new Prostor("sklad", " , muniční sklad patřící ke stanici");
        tenpennyTower = new Prostor("Vez", " ,nebo také Tenpenny's Tower je majetkem\n"
                + "Alastaira Tenpennyho,který za nemalý peníz\n"
                + "zajišťuje lidem co zaplatí ochranu před okolním světem");
        supermarket = new Prostor("supermarket", " , plolorozbořený a zchátralý supermarket");

        // přiřazují se průchody mezi prostory (sousedící místnosti)
        wasteland.setVychod(megaton);
        wasteland.setVychod(tenpennyTower);
        wasteland.setVychod(station);
        wasteland.setVychod(supermarket);
        supermarket.setVychod(wasteland);
        supermarket.setVychod(megaton);
        supermarket.setVychod(tenpennyTower);
        supermarket.setVychod(station);
        station.setVychod(ammo);
        station.setVychod(tenpennyTower);
        station.setVychod(megaton);
        station.setVychod(supermarket);
        station.setVychod(wasteland);
        megaton.setVychod(station);
        megaton.setVychod(tenpennyTower);
        megaton.setVychod(supermarket);
        megaton.setVychod(wasteland);
        ammo.setVychod(station);
        tenpennyTower.setVychod(wasteland);
        tenpennyTower.setVychod(megaton);
        tenpennyTower.setVychod(tenpennyTower);
        tenpennyTower.setVychod(station);

        // vkládání věcí do místností
        Vec auto = new Vec("auto", false);
        megaton.vlozVec(auto);
        Vec mentas = new Vec("Mentas", true);
        megaton.vlozVec(mentas);
        Vec atomovka = new Vec("atomovka", false);
        megaton.vlozVec(atomovka);
        Vec zboreniste = new Vec("zboreniste", false);
        wasteland.vlozVec(zboreniste);
        Vec mocal = new Vec("mocal", false);
        wasteland.vlozVec(mocal);
        Vec nukaKola = new Vec("Nuka-Kola", true);
        wasteland.vlozVec(nukaKola);
        Vec pistole = new Vec("pistole", true);
        wasteland.vlozVec(pistole);
        pistole.rozbita(true);
        Vec pruzina = new Vec("pruzina", true);
        auto.vlozVec(pruzina);
        Vec udernik = new Vec("udernik", true);
        zboreniste.vlozVec(udernik);
        Vec trezor = new Vec("trezor", false);
        supermarket.vlozVec(trezor);
        Vec paklic = new Vec("klic", true);
        trezor.vlozVec(paklic);
        Vec raos = new Vec("RAOS", true);
        trezor.vlozVec(raos);
        Vec regaly = new Vec("regaly", false);
        supermarket.vlozVec(regaly);
        Vec obesenec = new Vec("obesenec", false);
        supermarket.vlozVec(obesenec);
        Vec papiry = new Vec("papiry", true);
        station.vlozVec(papiry);
        Vec cela = new Vec("cela", false);
        station.vlozVec(cela);
        Vec ciga = new Vec("cigarety", true);
        station.vlozVec(ciga);
        Vec radio = new Vec("radio", false);
        station.vlozVec(radio);
        Vec pocitac = new Vec("pocitac", false);
        tenpennyTower.vlozVec(pocitac);
        Vec bomba = new Vec("bomba", true);
        ammo.vlozVec(bomba);
        Vec bedna = new Vec("bedna", false);
        zboreniste.vlozVec(bedna);
        Vec dekoder = new Vec("dekoder", true);
        bedna.vlozVec(dekoder);

        //popisy věcí
        auto.setPopis("Tak tohle by neopravil už ani Bill Gates...");
        mentas.setPopis("Jojo tyto tableky si získali docela velký věhlas, jen nevím,\n"
                + "jestli svojí účiností nebo halucinacemi, které působí...");
        atomovka.setPopis("Hmmm, krásná, vleká a nevybuchlá....už se těšim na silvestr...");
        zboreniste.setPopis("Tak tady bych nechtěl bydle, ale zase maj hodně světla...");
        mocal.setPopis("Bubli, bubli, bublá nám tu radioaktivita...");
        nukaKola.setPopis("Podávejtě ledově vychlazené a za tmy svítí...");
        pistole.setPopis("To se může hodit. Jen by to chtělo opravit. Musí tu být někde součástky...");
        pruzina.setPopis("Paráda...to se hodí na opravu pistole...");
        udernik.setPopis("Super....to použiji na opravu pistole...");
        paklic.setPopis("Klíč od muničáku v rukou psyhopata...Bude sranda...");
        raos.setPopis("Hrozná zkratka = Rušička Automatických Obranných Systémů...");
        regaly.setPopis("Ty regály byly naposled plný, když moje mrtvá babička ještě měla svoje zuby.");
        obesenec.setPopis("Kdo by kupoval oběšebýho hispánce??");
        papiry.setPopis("Takhle tady nechat válet osobní složky a příkazy k vykonáni trestu smrti, jaká škoda...");
        cela.setPopis("Tak celu jsem zevnitř nikdy neviděl, když vynechám unesení Enklávou, uvěznění supermutanty,\n"
                + "zajetí otrokáři a vyslíchání potulnými lovci lidí...");
        ciga.setPopis("Jaj...Dlouho sem nekouřil...");
        radio.setPopis("Staré hnusné oprýskané...Tak schválně, chytim Evropu 2??");
        pocitac.setPopis("Tak ten má dost...");
        bomba.setPopis("To musí být ta bomba...Tak sebrat a honem s ní do Věže...");
        bedna.setPopis("Bedna harampádí...");
        trezor.setPopis("Pěknej sefj...jen by to chtělo nějaký dekodér na prolomení kódu.");
        dekoder.setPopis("Tim by se dalo něco otevřít...");

        // vkladani postav do hry
        Postava joe = new Postava("Joe", "Ahoj, nechtěl(a) by jsi mi s něčím pomoci. Sem Joe Cluster.\n"
                + "Alastair Tenpenny mě připravil o všechno,\n"
                + "o mou rodinu, o moji povest a ted nadesel cas za to zaplatit.\n"
                + "Promluv si s Criss, ta ti poví jaký je plán...");
        megaton.vlozPostavu(joe);
        Postava blazen = new Postava("blazen", "Oooo, děkuji ti Bože za tento dar z nebes.");
        megaton.vlozPostavu(blazen);
        Postava criss = new Postava("Criss", "Ahoj, tebe musí posílat Joe. Já jsem Criss. Tvým úkolem bude dostat\n"
                + "se do skladu munice ve staré policejní stanici, ukrást bombu a tu pak umístit do Věže.\n"
                + "Stručný a jasný ne?? Naučíme starýho páprdu lítat. Začni v spermarketu s trezorem.");
        megaton.vlozPostavu(criss);
        Postava supermutant = new Postava("supermutant", "Grrr, odprejskni cizinče...");
        wasteland.vlozPostavu(supermutant);

        //vkladání popisů postav
        blazen.setPopis("Co to má za logiku uctívat nevybuchlou atomovou bombu??...Jeho problém...");
        joe.setPopis("Joe, celým jménem Joe Cluster, je starý, životem zničený pán. V dřívějších dobách\n"
                + "byl partnerem Alastaira Tenpenny. Ten ho však nakonec z projektu vyštípal,\n"
                + "připravil ho o majetek a o rodinu. Pošpinil mu jméno a od té doby se zkrývá\n"
                + "zde v Megatonu.");
        criss.setPopis("Hezké oči, hezký účes, parádní postava...Škoda, že je to klvelačnej psychopat...");

        aktualniProstor = megaton;  // hra začíná v prostoru hala

        //zamceny prostor
        ammo.zamknout(true);
        ammo.setKlic(paklic);
        station.nebezpeci(true);
        station.setKlic(raos);
        tenpennyTower.hlidat(true);
        tenpennyTower.setKlic(pistole);

        //trezor
        trezor.zamknout(true);
        trezor.setKlic(dekoder);
    }

    /**
     *  Metoda nastaví aktuální prostor, používá se nejčastěji při přechodu mezi prostory
     *
     *@param  prostor nový aktuální prostor
     */
    public void setAktualniMistnost(Prostor prostor) {
        for (Predplatitel pred : aktualniProstor.getPredplatitele()) {
             prostor.zaregistruj(pred);
        }
        for (Predplatitel pred : prostor.getPredplatitele()) {
            aktualniProstor.odregistruj(pred);
        }

        aktualniProstor = prostor;
        upozorniMeNaZmenu();
        aktualniProstor.upozorniMeNaZmenu();
        System.out.println("set " + prostor.getNazev() + ", " + predplatitele.size());
    }


      /**
     *  Metoda vrací odkaz na aktuální prostor, ve ktetém se hráč právě nachází.
     *
     *@return     aktuální prostor
     */
    public Prostor getAktualniProstor() {
        return aktualniProstor;
    }

     /**
     * Tato metoda slouží pro komunikaci s batohem...
     */
    public Batoh getBatoh() {
        return batoh;
    }
    private List<Predplatitel> predplatitele = new ArrayList<Predplatitel>();

    @Override
    public void zaregistruj(Predplatitel predplatitel) {
        predplatitele.add(predplatitel);
    }

    @Override
    public void odregistruj(Predplatitel predplatitel) {
        predplatitele.remove(predplatitel);
    }

    @Override
    public void upozorniMeNaZmenu() {
        for (Predplatitel predplatiel : predplatitele) {
            predplatiel.refresh();
        }
    }

}
